"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/3/19 14:32
@Description : 聊天窗口客户端

"""
import socket
import threading

import wx


class ChatClientFrame(wx.Frame):

    def __init__(self):
        """
            两个文本框    显示聊天记录   输入聊天信息
            四个按钮     加入  离开  清空  发送
        """
        wx.Frame.__init__(self, None, title='2511群聊客户端', size=(480, 680))
        self.panel = wx.Panel(self)
        self.show_info = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE | wx.TE_READONLY, size=(440, 400), pos=(10, 60))
        self.input_text = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE, size=(440, 80), pos=(10, 470))
        self.add_chat_btn = wx.Button(self.panel, label='加入群聊', pos=(10, 10), size=(200, 40))
        self.exit_chat_btn = wx.Button(self.panel, label='退出群聊', pos=(250, 10), size=(200, 40))
        self.clear_message_btn = wx.Button(self.panel, label='清空信息', pos=(10, 580), size=(200, 40))
        self.send_message_btn = wx.Button(self.panel, label='发送信息', pos=(220, 580), size=(200, 40))

        # 绑定按钮事件
        self.add_chat_btn.Bind(wx.EVT_BUTTON, self.add_chat_fn)
        self.exit_chat_btn.Bind(wx.EVT_BUTTON, self.exit_chat_fn)
        self.clear_message_btn.Bind(wx.EVT_BUTTON, self.clear_message_fn)
        self.send_message_btn.Bind(wx.EVT_BUTTON, self.send_message_fn)

        # 初始化一个socket
        self.client_socket = None

        # 初始化客户端状态
        self.is_connected = False

    #  加入
    def add_chat_fn(self, event):
        # 判定客户端状态  避免重复连接
        if not self.is_connected:
            try:
                self.show_info.AppendText('开始连接服务器....\n')
                self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.client_socket.connect(('192.168.1.49', 9999))
                # 连接成功  改变客户端的连接状态
                self.is_connected = True
                self.show_info.AppendText('服务器连接成功....\n')
                # 创建线程  开始监听服务端是否发送消息
                threading.Thread(target=self.receive_message_fn).start()
            except ConnectionRefusedError:
                self.show_info.AppendText('服务器连接失败,请重试....\n')

    # 退出
    def exit_chat_fn(self, event):

        self.client_socket.close()
        self.is_connected = False

    # 清空
    def clear_message_fn(self, event):
        self.show_info.Clear()

    # 发送
    def send_message_fn(self, event):
        if self.is_connected:
            # 获取用户输入的信息
            user_message = self.input_text.GetValue()
            self.client_socket.send(user_message.encode('UTF-8'))
            # 清空输入框
            self.input_text.Clear()
        else:
            self.show_info.AppendText('请先加入群聊天室,在发送消息...')

    #  接收服务端信息的函数
    def receive_message_fn(self):
        try:
            while self.is_connected:
                message = self.client_socket.recv(1024).decode('utf-8')
                self.show_info.AppendText(message)
        except ConnectionAbortedError:
            self.show_info.AppendText('已退出群聊...\n')
        except ConnectionResetError:
            self.is_connected = False
            self.show_info.AppendText('服务器异常,连接中断...\n')


if __name__ == '__main__':
    app = wx.App()
    chat_client_frame = ChatClientFrame()
    chat_client_frame.Show()
    app.MainLoop()
